import { reqCartList, reqDeleteCartById, reqUpdateCheckedById } from "@/api"
import { Promise } from "core-js"
const actions = {
    // 获取购物车列表数据
    async getCartList(context) {
        const result = await reqCartList()
        // 判断是否能获取个人购物车数据
        if (result.code === 200) {
            context.commit("GETCARTLIST", result.data)
        }
    },
    // 删除购物车某一个产品的数据
    async deleteCartById(context, skuId) {
        const result = await reqDeleteCartById(skuId)
        if (result.code == 200) {
            return Promise.resolve("ok")
        } else {
            return Promise.reject(new Error("failed"))
        }
    },
    // 修改购物车某一个产品状态
    async updateCheckedById(context, { skuId, isChecked }) {
        const result = await reqUpdateCheckedById(skuId, isChecked)
        if (result.code == 200) {
            return Promise.resolve("ok")
        } else {
            return Promise.reject(new Error("failed"))
        }
    },
    // 删除所有选中的商品
    deleteAllCheckedCart({ dispatch, getters }) {
        // 存放所有promise结果
        const promiseAll = []
        getters.cartList.cartInfoList.forEach((item) => {
            if (item.isChecked === 1) {
                const promise = dispatch("deleteCartById", item.skuId)
                // 将每一次返回的promise结果放入数组
                promiseAll.push(promise)
            }
            // 同时返回多个promise执行结果，只要其中有一个报错，就返回错误
            return Promise.all(promiseAll)
        })
    },
    // 修改全部产品的状态
    updateAllCartIsChecked({ dispatch, state }, isChecked) {
        // 存储promise
        let promiseAll = []
        state.cartList[0].cartInfoList.forEach((item) => {
            const promise = dispatch("updateCheckedById", { skuId: item.skuId, isChecked })
            promiseAll.push(promise)
        })
        return Promise.all(promiseAll)
    },
}
const mutations = {
    GETCARTLIST(state, cartList) {
        state.cartList = cartList
    },
}
const state = {
    cartList: [],
}
const getters = {
    cartList(state) {
        return state.cartList[0] || {}
    },
}

export default {
    namespaced: true, //开启命名空间
    actions,
    mutations,
    state,
    getters,
}
